package com.apimanage.monitor.controller;

import com.apimanage.monitor.entity.ApiLog;
import com.apimanage.monitor.entity.ApiStatistics;
import com.apimanage.monitor.service.MonitorService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 监控服务控制器
 * 提供API调用日志查询、统计分析和监控数据展示的HTTP接口
 * 支持按API、用户、时间范围等多维度进行查询和统计
 */
@RestController
@RequestMapping("/api/monitor")
public class MonitorController {

    @Autowired
    private MonitorService monitorService;

    /**
     * 分页查询API调用日志接口
     * 支持多条件筛选和分页查询
     * @param apiId API的唯一标识（可选）
     * @param userId 用户ID（可选）
     * @param status 调用状态（可选，1表示成功，0表示失败）
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @param pageNum 当前页码，默认1
     * @param pageSize 每页记录数，默认10
     * @return 包含调用日志列表的分页结果
     */
    @GetMapping("/log/page")
    public Map<String, Object> getApiLogPage(
            @RequestParam(required = false) Long apiId,
            @RequestParam(required = false) Long userId,
            @RequestParam(required = false) Integer status,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startTime,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date endTime,
            @RequestParam(defaultValue = "1") Integer pageNum,
            @RequestParam(defaultValue = "10") Integer pageSize) {
        Map<String, Object> params = new HashMap<>();
        params.put("apiId", apiId);
        params.put("userId", userId);
        params.put("status", status);
        params.put("startTime", startTime);
        params.put("endTime", endTime);
        params.put("pageSize", pageSize);
        params.put("offset", (pageNum - 1) * pageSize);

        List<ApiLog> list = monitorService.getApiLogPage(params);
        Map<String, Object> result = new HashMap<>();
        result.put("code", 200);
        result.put("message", "success");
        result.put("data", list);
        return result;
    }

    /**
     * 根据API ID查询调用日志接口
     * 查询指定API的所有调用记录
     * @param apiId API的唯一标识
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @return 包含API调用日志列表的结果
     */
    @GetMapping("/log/api/{apiId}")
    public Map<String, Object> getApiLogByApiId(
            @PathVariable Long apiId,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startTime,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date endTime) {
        List<ApiLog> list = monitorService.getApiLogByApiId(apiId, startTime, endTime);
        Map<String, Object> result = new HashMap<>();
        result.put("code", 200);
        result.put("message", "success");
        result.put("data", list);
        return result;
    }

    /**
     * 根据用户ID查询调用日志接口
     * 查询指定用户的所有API调用记录
     * @param userId 用户ID
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @return 包含用户API调用日志列表的结果
     */
    @GetMapping("/log/user/{userId}")
    public Map<String, Object> getApiLogByUserId(
            @PathVariable Long userId,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startTime,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date endTime) {
        List<ApiLog> list = monitorService.getApiLogByUserId(userId, startTime, endTime);
        Map<String, Object> result = new HashMap<>();
        result.put("code", 200);
        result.put("message", "success");
        result.put("data", list);
        return result;
    }

    /**
     * 分页查询API调用统计数据接口
     * 查询API调用的统计信息
     * @param apiId API的唯一标识（可选）
     * @param startDate 开始日期（可选）
     * @param endDate 结束日期（可选）
     * @param pageNum 当前页码，默认1
     * @param pageSize 每页记录数，默认10
     * @return 包含API调用统计数据的分页结果
     */
    @GetMapping("/statistics/page")
    public Map<String, Object> getApiStatisticsPage(
            @RequestParam(required = false) Long apiId,
            @RequestParam(required = false) String startDate,
            @RequestParam(required = false) String endDate,
            @RequestParam(defaultValue = "1") Integer pageNum,
            @RequestParam(defaultValue = "10") Integer pageSize) {
        Map<String, Object> params = new HashMap<>();
        params.put("apiId", apiId);
        params.put("startDate", startDate);
        params.put("endDate", endDate);
        params.put("pageSize", pageSize);
        params.put("offset", (pageNum - 1) * pageSize);

        List<ApiStatistics> list = monitorService.getApiStatisticsPage(params);
        Map<String, Object> result = new HashMap<>();
        result.put("code", 200);
        result.put("message", "success");
        result.put("data", list);
        return result;
    }

    /**
     * 根据API ID和日期范围查询统计
     */
    @GetMapping("/statistics/api/{apiId}")
    public Map<String, Object> getApiStatisticsByApiIdAndDateRange(
            @PathVariable Long apiId,
            @RequestParam String startDate,
            @RequestParam String endDate) {
        List<ApiStatistics> list = monitorService.getApiStatisticsByApiIdAndDateRange(apiId, startDate, endDate);
        Map<String, Object> result = new HashMap<>();
        result.put("code", 200);
        result.put("message", "success");
        result.put("data", list);
        return result;
    }

    /**
     * 获取API调用概览统计
     */
    @GetMapping("/statistics/overview")
    public Map<String, Object> getApiOverviewStatistics(
            @RequestParam(required = false) List<Long> apiIds,
            @RequestParam String startDate,
            @RequestParam String endDate) {
        Map<String, Object> data = monitorService.getApiOverviewStatistics(apiIds, startDate, endDate);
        Map<String, Object> result = new HashMap<>();
        result.put("code", 200);
        result.put("message", "success");
        result.put("data", data);
        return result;
    }

}